/*
 * Copyright 2014 Objectos, Fábrica de Software LTDA.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package cnab.local.bradesco;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.joda.time.LocalDate;

import br.com.objectos.way.cnab.Bradesco;
import br.com.objectos.way.cnab.Codigo;
import br.com.objectos.way.cnab.Lote;
import br.com.objectos.way.cnab.Ocorrencia;
import br.com.objectos.way.cnab.Retorno;
import br.com.objectos.way.cnab.WayCnab;

/**
 * @author marcio.endo@objectos.com.br (Marcio Endo)
 */
public class FileCNABBradesco 
{

  private String name="";
  private String nameCSV="";
  
  private ArrayList<Lote> lotes = new ArrayList<Lote>();
  
  public FileCNABBradesco(File file)
  {
    this.lotes = readCNABRetornoBradesco(file);
    String fileName = file.getName().substring(0,file.getName().length()-4);
    this.name = fileName + ".ret";
    this.setNameCSV(fileName + ".csv");
  }
  
  public String getName() 
  {
    return name;
  }
  
  public void setName(String name) 
  {
    this.name = name;
  }
  public ArrayList<Lote> getLotes() 
  {
    return lotes;
  }
  public void setLotes(ArrayList<Lote> lotes) 
  {
    this.lotes = lotes;
  }

  public static ArrayList<Lote> readCNABRetornoBradesco(File file)
  {
    Retorno retorno = WayCnab.retornoDe(file);
    System.out.println("**************************************");
    System.out.println("Reading " + file.getName());
    System.out.println("**************************************");
    List<Lote> lotesTemp = retorno.getLotes();
    ArrayList<Lote> lotes = new ArrayList<Lote>();
    for (Lote lote : lotesTemp) 
    {
      lotes.add(lote);
    }
    
    int iLote=0;
    for (Lote lote : lotes) 
    {
      System.out.println(++iLote + "\tLote " + lote.get(Bradesco.lote().numeroDoDocumento()));
      
      Integer agenciaCobradora = lote.get(Bradesco.lote().agenciaCobradora());
      Integer bancoCobrador = lote.get(Bradesco.lote().bancoCobrador());
      Integer carteiraNumero = lote.get(Bradesco.lote().carteiraNumero());
      Integer codigoDeOcorrencia = lote.get(Bradesco.lote().codigoDeOcorrencia());
      LocalDate dataDeCredito = lote.get(Bradesco.lote().dataDeCredito());
      LocalDate dataDeOcorrencia = lote.get(Bradesco.lote().dataDeOcorrencia());
      LocalDate dataDeVencimento = lote.get(Bradesco.lote().dataDeVencimento());
      Double despesaDeCobranca = lote.get(Bradesco.lote().despesaDeCobranca());
      Codigo identificacaoDaEmpresa = lote.get(Bradesco.lote().identificacaoDaEmpresa());
      String indicadorDeRateio = lote.get(Bradesco.lote().indicadorDeRateio());
      String motivoOcorrencia = lote.get(Bradesco.lote().motivoOcorrencia());
      Long motivoRejeicao = lote.get(Bradesco.lote().motivoRejeicao());
      String nossoNumero = lote.get(Bradesco.lote().nossoNumero());
      String nossoNumero2 = lote.get(Bradesco.lote().nossoNumero2());
      Long numeroDeInscricaoDaEmpresa = lote.get(Bradesco.lote().numeroDeInscricaoDaEmpresa());
      String numeroDoDocumento = lote.get(Bradesco.lote().numeroDoDocumento());
      Integer numeroSeqRegistro = lote.get(Bradesco.lote().numeroSeqRegistro());
      Ocorrencia ocorrencia = lote.get(Bradesco.lote().ocorrencia());
      Integer tipoDeInscricaoDaEmpresa = lote.get(Bradesco.lote().tipoDeInscricaoDaEmpresa());
      String usoDaEmpresa = lote.get(Bradesco.lote().usoDaEmpresa());
      Double valorAbatimento = lote.get(Bradesco.lote().valorAbatimento());
      Double valorDesconto = lote.get(Bradesco.lote().valorDesconto());
      Double valorIOF = lote.get(Bradesco.lote().valorIOF());
      Double valorJurosOperacao = lote.get(Bradesco.lote().valorJurosOperacao());
      Double valorMora = lote.get(Bradesco.lote().valorMora());
      Double valorOutrasDespesas = lote.get(Bradesco.lote().valorOutrasDespesas());
      Double valorOutros = lote.get(Bradesco.lote().valorOutros());
      Double valorPago = lote.get(Bradesco.lote().valorPago());    
      Double valorTitulo = lote.get(Bradesco.lote().valorTitulo());
      
      System.out.println("\tagenciaCobradora\t" +agenciaCobradora);
      System.out.println("\tbancoCobrador\t" +bancoCobrador);
      System.out.println("\tcarteiraNumero\t" +carteiraNumero);
      System.out.println("\tcodigoDeOcorrencia\t" +codigoDeOcorrencia);
      System.out.println("\tdataDeCredito\t" +dataDeCredito);
      System.out.println("\tdataDeOcorrencia\t" +dataDeOcorrencia);
      System.out.println("\tdataDeVencimento\t" +dataDeVencimento);
      System.out.println("\tdespesaDeCobranca\t" +despesaDeCobranca);
      System.out.println("\tidentificacaoDaEmpresa\t" +identificacaoDaEmpresa);
      System.out.println("\tindicadorDeRateio\t" +indicadorDeRateio);
      System.out.println("\tmotivoOcorrencia\t" +motivoOcorrencia);
      System.out.println("\tmotivoRejeicao\t" +motivoRejeicao);
      System.out.println("\tnossoNumero\t" +nossoNumero);
      System.out.println("\tnossoNumero2\t" +nossoNumero2);
      System.out.println("\tnumeroDeInscricaoDaEmpresa\t" +numeroDeInscricaoDaEmpresa);
      System.out.println("\tnumeroDoDocumento\t" +numeroDoDocumento);
      System.out.println("\tnumeroSeqRegistro\t" +numeroSeqRegistro);
      System.out.println("\tocorrencia\t" +ocorrencia.getDescricao());
      System.out.println("\ttipoDeInscricaoDaEmpresa\t" +tipoDeInscricaoDaEmpresa);
      System.out.println("\tusoDaEmpresa\t" +usoDaEmpresa);
      System.out.println("\tvalorAbatimento\t" +valorAbatimento);
      System.out.println("\tvalorDesconto\t" +valorDesconto);
      System.out.println("\tvalorIOF\t" +valorIOF);
      System.out.println("\tvalorJurosOperacao\t" +valorJurosOperacao);
      System.out.println("\tvalorMora\t" +valorMora);
      System.out.println("\tvalorOutrasDespesas\t" +valorOutrasDespesas);
      System.out.println("\tvalorOutros\t" +valorOutros);
      System.out.println("\tvalorPago\t" +valorPago);
      System.out.println("\tvalorTitulo\t" +valorTitulo);
      System.out.println("------------------------------------");
    }    
    return lotes;
  }

  public static void writeCsvFile(String sFileName, ArrayList<Lote> lotes)
  {
     try
     {
         FileWriter writer = new FileWriter(sFileName);
    
         writer.append("agenciaCobradora");
         writer.append(";");
         writer.append("bancoCobrador");
         writer.append(";");
         writer.append("carteiraNumero");
         writer.append(";");
         writer.append("codigoDeOcorrencia");
         writer.append(";");
         writer.append("dataDeCredito");
         writer.append(";");
         writer.append("dataDeOcorrencia");
         writer.append(";");
         writer.append("dataDeVencimento");
         writer.append(";");
         writer.append("despesaDeCobranca");
         writer.append(";");
         writer.append("identificacaoDaEmpresa");
         writer.append(";");
         writer.append("indicadorDeRateio");
         writer.append(";");
         writer.append("motivoOcorrencia");
         writer.append(";");
         writer.append("motivoRejeicao");
         writer.append(";");
         writer.append("nossoNumero");
         writer.append(";");
         writer.append("nossoNumero2");
         writer.append(";");
         writer.append("numeroDeInscricaoDaEmpresa");
         writer.append(";");
         writer.append("numeroDoDocumento");
         writer.append(";");
         writer.append("numeroSeqRegistro");
         writer.append(";");
         writer.append("ocorrencia");
         writer.append(";");
         writer.append("tipoDeInscricaoDaEmpresa");
         writer.append(";");
         writer.append("usoDaEmpresa");
         writer.append(";");
         writer.append("valorAbatimento");
         writer.append(";");
         writer.append("valorDesconto");
         writer.append(";");
         writer.append("valorIOF");
         writer.append(";");
         writer.append("valorJurosOperacao");
         writer.append(";");
         writer.append("valorMora");
         writer.append(";");
         writer.append("valorOutrasDespesas");
         writer.append(";");
         writer.append("valorOutros");
         writer.append(";");
         writer.append("valorPago");
         writer.append(";");
         writer.append("valorTitulo");
         writer.append('\n');
         for (Lote lote : lotes) 
         {
           Integer agenciaCobradora = lote.get(Bradesco.lote().agenciaCobradora());
           Integer bancoCobrador = lote.get(Bradesco.lote().bancoCobrador());
           Integer carteiraNumero = lote.get(Bradesco.lote().carteiraNumero());
           Integer codigoDeOcorrencia = lote.get(Bradesco.lote().codigoDeOcorrencia());
           LocalDate dataDeCredito = lote.get(Bradesco.lote().dataDeCredito());
           LocalDate dataDeOcorrencia = lote.get(Bradesco.lote().dataDeOcorrencia());
           LocalDate dataDeVencimento = lote.get(Bradesco.lote().dataDeVencimento());
           Double despesaDeCobranca = lote.get(Bradesco.lote().despesaDeCobranca());
           Codigo identificacaoDaEmpresa = lote.get(Bradesco.lote().identificacaoDaEmpresa());
           String indicadorDeRateio = lote.get(Bradesco.lote().indicadorDeRateio());
           String motivoOcorrencia = lote.get(Bradesco.lote().motivoOcorrencia());
           Long motivoRejeicao = lote.get(Bradesco.lote().motivoRejeicao());
           String nossoNumero = lote.get(Bradesco.lote().nossoNumero());
           String nossoNumero2 = lote.get(Bradesco.lote().nossoNumero2());
           Long numeroDeInscricaoDaEmpresa = lote.get(Bradesco.lote().numeroDeInscricaoDaEmpresa());
           String numeroDoDocumento = lote.get(Bradesco.lote().numeroDoDocumento());
           Integer numeroSeqRegistro = lote.get(Bradesco.lote().numeroSeqRegistro());
           Ocorrencia ocorrencia = lote.get(Bradesco.lote().ocorrencia());
           Integer tipoDeInscricaoDaEmpresa = lote.get(Bradesco.lote().tipoDeInscricaoDaEmpresa());
           String usoDaEmpresa = lote.get(Bradesco.lote().usoDaEmpresa());
           Double valorAbatimento = lote.get(Bradesco.lote().valorAbatimento());
           Double valorDesconto = lote.get(Bradesco.lote().valorDesconto());
           Double valorIOF = lote.get(Bradesco.lote().valorIOF());
           Double valorJurosOperacao = lote.get(Bradesco.lote().valorJurosOperacao());
           Double valorMora = lote.get(Bradesco.lote().valorMora());
           Double valorOutrasDespesas = lote.get(Bradesco.lote().valorOutrasDespesas());
           Double valorOutros = lote.get(Bradesco.lote().valorOutros());
           Double valorPago = lote.get(Bradesco.lote().valorPago());    
           Double valorTitulo = lote.get(Bradesco.lote().valorTitulo());
         
           //generate whatever data you want
           if(agenciaCobradora!=null){writer.append(agenciaCobradora.toString());}else { writer.append("");}writer.append(";");
           if(bancoCobrador!=null){writer.append(bancoCobrador.toString());}else { writer.append("");}writer.append(";");
           if(carteiraNumero!=null){writer.append(carteiraNumero.toString());}else { writer.append("");}writer.append(";");
           if(codigoDeOcorrencia!=null){writer.append(codigoDeOcorrencia.toString());}else { writer.append("");}writer.append(";");
           if(dataDeCredito!=null){writer.append(dataDeCredito.toString());}else { writer.append("");}writer.append(";");
           if(dataDeOcorrencia!=null){writer.append(dataDeOcorrencia.toString());}else { writer.append("");}writer.append(";");
           if(dataDeVencimento!=null){writer.append(dataDeVencimento.toString());}else { writer.append("");}writer.append(";");
           if(despesaDeCobranca!=null){writer.append(despesaDeCobranca.toString());}else { writer.append("");}writer.append(";");
           if(identificacaoDaEmpresa!=null){writer.append(identificacaoDaEmpresa.toString());}else { writer.append("");}writer.append(";");
           if(indicadorDeRateio!=null){writer.append(indicadorDeRateio);}else { writer.append("");}writer.append(";");
           if(motivoOcorrencia!=null){writer.append(motivoOcorrencia);}else { writer.append("");}writer.append(";");
           if(motivoRejeicao!=null){writer.append(motivoRejeicao.toString());}else { writer.append("");}writer.append(";");
           if(nossoNumero!=null){writer.append(nossoNumero);}else { writer.append("");}writer.append(";");
           if(nossoNumero2!=null){writer.append(nossoNumero2);}else { writer.append("");}writer.append(";");
           if(numeroDeInscricaoDaEmpresa!=null){writer.append(numeroDeInscricaoDaEmpresa.toString());}else { writer.append("");}writer.append(";");
           if(numeroDoDocumento!=null){writer.append(numeroDoDocumento);}else { writer.append("");}writer.append(";");
           if(numeroSeqRegistro!=null){writer.append(numeroSeqRegistro.toString());}else { writer.append("");}writer.append(";");
           if(ocorrencia!=null){writer.append(ocorrencia.getDescricao());}else { writer.append("");}writer.append(";");
           if(tipoDeInscricaoDaEmpresa!=null){writer.append(tipoDeInscricaoDaEmpresa.toString());}else { writer.append("");}writer.append(";");
           if(usoDaEmpresa!=null){writer.append(usoDaEmpresa);}else { writer.append("");}writer.append(";");
           if(valorAbatimento!=null){writer.append(valorAbatimento.toString());}else { writer.append("");}writer.append(";");
           if(valorDesconto!=null){writer.append(valorDesconto.toString());}else { writer.append("");}writer.append(";");
           if(valorIOF!=null){writer.append(valorIOF.toString());}else { writer.append("");}writer.append(";");
           if(valorJurosOperacao!=null){writer.append(valorJurosOperacao.toString());}else { writer.append("");}writer.append(";");
           if(valorMora!=null){writer.append(valorMora.toString());}else { writer.append("");}writer.append(";");
           if(valorOutrasDespesas!=null){writer.append(valorOutrasDespesas.toString());}else { writer.append("");}writer.append(";");
           if(valorOutros!=null){writer.append(valorOutros.toString());}else { writer.append("");}writer.append(";");
           if(valorPago!=null){writer.append(valorPago.toString());}else { writer.append("");}writer.append(";");
           if(valorTitulo!=null){writer.append(valorTitulo.toString());}else { writer.append("");}writer.append("\n");

         }
         writer.flush();
         writer.close();
     }
     catch(IOException e)
     {
          e.printStackTrace();
     } 
   }

  public String getNameCSV() {
    return nameCSV;
  }

  public void setNameCSV(String nameCSV) {
    this.nameCSV = nameCSV;
  }    
}
